package com.example.springbootgraduation.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.springbootgraduation.entity.NocvData;
import com.example.springbootgraduation.service.IndexService;
import com.example.springbootgraduation.vo.DataView;
import com.example.springbootgraduation.vo.NocvDataVo;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

//中国疫情管理系统
@Controller
public class ChinaDataManagerController {

    @Autowired
    private IndexService indexService;

    //跳转中国疫情管理系统
    @RequestMapping("/toChinaManager")
    public String toChinaManager(){
        return "admin/chinaDataManager";
    }

    //带有分页、带有模糊查询
    @RequestMapping("/listDataByPage")
    @ResponseBody//返回一个json
    public DataView listDataByPage(NocvDataVo nocvDataVo){
        // 1、创建分页的对象，当前页，每页限制大小，使用MybatisPlus技术
        IPage<NocvData> page = new Page<>(nocvDataVo.getPage(),nocvDataVo.getLimit());
        // 2、创建一个MybatisPlus的封装条件（创建模糊查询条件）
        QueryWrapper<NocvData> queryWrapper = new QueryWrapper<>();
        queryWrapper.like(!(nocvDataVo.getName() == null),"name",nocvDataVo.getName());
        // 3、疫情数据确诊最多的排在最上面
        queryWrapper.orderByDesc("value");
        // 4、查询数据库
        indexService.page(page,queryWrapper);
        // 5、返回数据封装
        DataView dataView = new DataView(page.getTotal(),page.getRecords());
        return dataView;

    }

    /**
     * 删除中国地图疫情数据ID
     */
    @RequestMapping("/china/deleteById")
    @ResponseBody
    public DataView deleteById(Integer id){
        indexService.removeById(id);
        DataView dataView = new DataView();
        dataView.setCode(200);
        dataView.setMsg("删除中国地图数据成功！");
        return dataView;
    }

    /**
     * 新增或者修改中国地图疫情数据，使用ID来判断
     * 如果id：nocvdata有值修改，没有值就是新增
     * update nocv_data set name="" where id=?
     */
    @RequestMapping("/china/addOrUpdateChina")
    @ResponseBody
    public DataView addOrUpdateChina(NocvData nocvData){
        boolean save = indexService.saveOrUpdate(nocvData);//新增或者修改
        DataView dataView = new DataView();
        if (save){
            dataView.setCode(200);
            dataView.setMsg("新增中国地图数据成功！");
            return dataView;
        }else {
            dataView.setCode(100);
            dataView.setMsg("新增中国地图数据失败！");
            return dataView;
        }
    }

    /**
     * Excel的拖拽或者点击上传文件
     * 1、前台页面发送一个请求，上传文件MutilpartFile HTTP
     * 2、Controller，上传文件MutilpartFile 参数
     * 3、POI 解析文件，里面的数据一行一行全部解析出来
     * 4、每一条数据插入到数据库
     */
    @RequestMapping("/excelImportChina")
    @ResponseBody
    public DataView excelImportChina(@RequestParam("file") MultipartFile file) throws Exception{//接收文件
        DataView dataView=new DataView();
        //1、文件不能为空
        if (file.isEmpty()){
            dataView.setMsg("文件为空，不能为空！");
        }
//        //2、POI获取Excel解析数据
//        HSSFWorkbook wb=new HSSFWorkbook(file.getInputStream());//工作簿
//        HSSFSheet sheet = wb.getSheetAt(0);//拿到第一个工作表
//        //3、定义一个程序结婚 接收 文件中的数据
//        List<NocvData> list = new ArrayList<>();
//        //4、定义一个每一行数据
//        HSSFRow row = null;
//        //5、解析数据，装到集合里面
//        for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {//拿到所有的数据
//            //5.1定义一个空的实体
//            NocvData nocvData = new NocvData();
//            //5.2拿到每一行的数据 放到实体类里面
//            row=sheet.getRow(i);
//            //5.3 解析数据
//            nocvData.setName(row.getCell(0).getStringCellValue());//第一列数据，拿到城市的名称
//            nocvData.setValue((int) row.getCell(1).getNumericCellValue());//第二列数据，拿到确诊人数，强转为int类型
//            //6、添加list集合
//            list.add(nocvData);
//        }
//        //7、插入数据库
//        indexService.saveBatch(list);//数据集合
//        dataView.setCode(200);
//        dataView.setMsg("Excel数据插入成功！");
//        return dataView;
//    }//另一种写法
        try{
            //2、POI获取Excel解析数据
            HSSFWorkbook wb=new HSSFWorkbook(file.getInputStream());//工作簿
            HSSFSheet sheet = wb.getSheetAt(0);//拿到第一个工作表
            //3、定义一个程序结婚 接收 文件中的数据
            List<NocvData> list = new ArrayList<>();
            //4、定义一个每一行数据
            HSSFRow row = null;
            //5、解析数据，装到集合里面
            for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {//拿到所有的数据
                //5.1定义一个空的实体
                NocvData nocvData = new NocvData();
                //5.2拿到每一行的数据 放到实体类里面
                row=sheet.getRow(i);
                //5.3 解析数据
                nocvData.setName(row.getCell(0).getStringCellValue());//第一列数据，拿到城市的名称
                nocvData.setValue((int) row.getCell(1).getNumericCellValue());//第二列数据，拿到确诊人数，强转为int类型
                //5.4添加list集合
                list.add(nocvData);
            }
            //6、循环展示导入的数据
            indexService.saveBatch(list);//数据集合(MybatisPlus技术)
            dataView.setCode(200);
            dataView.setMsg("Excel数据插入成功,请刷新页面！");
            return dataView;
        } catch (Exception e){
            dataView.setCode(100);
            dataView.setMsg("导入失败，该文件网站无法解析！");
            return dataView;
//            e.printStackTrace();
        }
    }

    /**
     * 导出Excel中国疫情数据
     * 1、查询数据
     * 2、建立Excel对象，封装数据
     * 3、建立输出流，输出文件
     */
    @RequestMapping("/excelOutPortChina")
    @ResponseBody
    public void excelOutPortChina(HttpServletResponse response) throws Exception {//拿到浏览器对象
        //1、查询数据库【查询所有，复合条件的数据查询出来】
        List<NocvData> list = indexService.list();//所有得疫情数据都在这里面
        //2、建立Excel对象，封装数据
        response.setCharacterEncoding("utf-8");//将浏览器导出的excel表改成utf-8格式
        //3、创建excel对象
        HSSFWorkbook wb = new HSSFWorkbook();//创建工作簿对象
        //4、创建sheet对象
        HSSFSheet sheet = wb.createSheet("中国疫情数据");//创建工作表，名字为中国疫情数据
        //5、创建表头
        HSSFRow hssfRow = sheet.createRow(0);//创建每列
        hssfRow.createCell(0).setCellValue("城市名称");//第一列名称
        hssfRow.createCell(1).setCellValue("确诊人数");//第二轮名称
        //6、遍历数据，封装Excel工作对象
        for (NocvData data : list){//使用foreach语法
            //拿到row
            HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum()+1);//每次追加一条数据
            dataRow.createCell(0).setCellValue(data.getName());//创建并获得第一列的数据
            dataRow.createCell(1).setCellValue(data.getValue());//创建并获得第二列的数据
        }
        //7、建立输出流，输出浏览器文件
        OutputStream os = null;//拿到
//        //8、设置excel名字与输出类型编码
//        response.setContentType("applicat/octet-stream;chartset-utf8");//浏览器输出类型
//        response.setHeader("Content-Disposition","attachment;filename="+ new String("中国疫情数据表".getBytes(),"iso-8859-1")+".xls");
//        //9、建立一个输出
//        os = response.getOutputStream();
//        //10、输出文件
//        wb.write(os);
//        os.flush();
//        //11、关闭输出流
//        os.close();//另一种写法
        try{
            response.setContentType("applicat/octet-stream;chartset-utf8");//浏览器输出类型
            response.setHeader("Content-Disposition","attachment;filename="+ new String("中国疫情数据表".getBytes(),"iso-8859-1")+".xls");
            os = response.getOutputStream();
            wb.write(os);
            os.flush();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                if (os !=null){
                    os.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

}
